home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / Miro_Downloader.exe / frontend_implementation / HTMLDisplay.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-11-12  |  8.8 KB  |  250 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. import threading
  5. import socket
  6. import re
  7. import xhtmltools
  8. import time
  9. import errno
  10. import os
  11. import app
  12. import config
  13. import download_utils
  14. import tempfile
  15. import os
  16. import platformutils
  17. import prefs
  18. import frontend
  19. from frontend_implementation import urlcallbacks
  20. tempdir = os.path.join(tempfile.gettempdir(), config.get(prefs.SHORT_APP_NAME))
  21.  
  22. def getDTVAPICookie():
  23.     pass
  24.  
  25.  
  26. def getDTVAPIURL():
  27.     pass
  28.  
  29. pageFinishCallbacks = { }
  30.  
  31. def runPageFinishCallback(area, url):
  32.     
  33.     try:
  34.         callback = pageFinishCallbacks[area]
  35.     except KeyError:
  36.         return None
  37.  
  38.     callback(url)
  39.  
  40.  
  41. def deferUntilLoad(function):
  42.     
  43.     def wrapper(self, *args):
  44.         if self.pageLoadFinised:
  45.             function(self, *args)
  46.         else:
  47.             self.deferedCalls.append((function, args))
  48.  
  49.     return wrapper
  50.  
  51.  
  52. def initTempDir():
  53.     if os.path.exists(tempdir):
  54.         for child in os.listdir(tempdir):
  55.             
  56.             try:
  57.                 os.unlink(os.path.join(tempdir, child))
  58.             continue
  59.             continue
  60.  
  61.         
  62.     else:
  63.         os.mkdir(tempdir)
  64.  
  65.  
  66. def makeFileUrl(path):
  67.     path = platformutils.osFilenameToFilenameType(path.replace('\\', '/'))
  68.     return 'file:///' + platformutils.makeURLSafe(path)
  69.  
  70.  
  71. def compareFileUrls(url1, url2):
  72.     if not url1.startswith('file://') or not url2.startswith('file://'):
  73.         return False
  74.     
  75.     
  76.     def normalize(url):
  77.         path = download_utils.getFileURLPath(url)
  78.         return os.path.normpath(platformutils.getLongPathName(path))
  79.  
  80.     return normalize(url1) == normalize(url2)
  81.  
  82.  
  83. class HTMLDisplay(app.Display):
  84.     '''Selectable Display that shows a HTML document.'''
  85.     
  86.     def __init__(self, html, existingView = None, frameHint = None, areaHint = None, baseURL = None):
  87.         self.initialHTML = html
  88.         self.area = None
  89.         self.pageLoadFinised = False
  90.         self.deferedCalls = []
  91.         self.location = None
  92.         if baseURL == config.get(prefs.CHANNEL_GUIDE_URL):
  93.             self.removeTempFile = False
  94.         else:
  95.             self.removeTempFile = True
  96.  
  97.     
  98.     def setInitialHTML(self):
  99.         if not os.path.exists(tempdir):
  100.             os.mkdir(tempdir)
  101.         
  102.         (handle, location) = tempfile.mkstemp('.html', dir = tempdir)
  103.         handle = os.fdopen(handle, 'wt')
  104.         
  105.         try:
  106.             handle.write(self.initialHTML)
  107.         finally:
  108.             handle.close()
  109.  
  110.         self.location = os.path.abspath(location)
  111.         self.url = makeFileUrl(self.location)
  112.         urlcallbacks.installCallback(self.url, self.onURLLoad)
  113.         frontend.jsBridge.xulNavigateDisplay(self.area, self.url)
  114.  
  115.     
  116.     def pageFinishCallback(self, url):
  117.         if url.startswith('file://') and compareFileUrls(url, self.url):
  118.             self.pageLoadFinised = True
  119.             for function, args in self.deferedCalls:
  120.                 function(self, *args)
  121.             
  122.             if self.removeTempFile:
  123.                 
  124.                 try:
  125.                     os.unlink(self.location)
  126.  
  127.             
  128.         
  129.  
  130.     
  131.     def setArea(self, area):
  132.         self.area = area
  133.         self.pageLoadFinised = False
  134.         pageFinishCallbacks[self.area] = self.pageFinishCallback
  135.         self.setInitialHTML()
  136.  
  137.     
  138.     def removedFromArea(self):
  139.         
  140.         try:
  141.             del pageFinishCallbacks[self.area]
  142.         except KeyError:
  143.             pass
  144.  
  145.         self.area = None
  146.  
  147.     
  148.     def navigateToFragment(self, fragment):
  149.         fullUrl = '%s#%s' % (self.url, fragment)
  150.         frontend.jsBridge.xulNavigateDisplay(self.area, fullUrl)
  151.  
  152.     navigateToFragment = deferUntilLoad(navigateToFragment)
  153.     
  154.     def addItemAtEnd(self, xml, id):
  155.         frontend.jsBridge.xulAddElementAtEnd(self.area, xml, id)
  156.  
  157.     addItemAtEnd = deferUntilLoad(addItemAtEnd)
  158.     
  159.     def addItemBefore(self, xml, id):
  160.         frontend.jsBridge.xulAddElementBefore(self.area, xml, id)
  161.  
  162.     addItemBefore = deferUntilLoad(addItemBefore)
  163.     
  164.     def removeItem(self, id):
  165.         frontend.jsBridge.xulRemoveElement(self.area, id)
  166.  
  167.     removeItem = deferUntilLoad(removeItem)
  168.     
  169.     def removeItems(self, ids):
  170.         for id in ids:
  171.             frontend.jsBridge.xulRemoveElement(self.area, id)
  172.         
  173.  
  174.     removeItems = deferUntilLoad(removeItems)
  175.     
  176.     def changeItem(self, *args):
  177.         self._doChangeItem(*args)
  178.  
  179.     changeItem = deferUntilLoad(changeItem)
  180.     
  181.     def changeItems(self, listOfArgs):
  182.         for args in listOfArgs:
  183.             self._doChangeItem(*args)
  184.         
  185.  
  186.     changeItems = deferUntilLoad(changeItems)
  187.     
  188.     def _doChangeItem(self, id, xml, changeHint):
  189.         if changeHint is None or changeHint.changedInnerHTML is not None:
  190.             frontend.jsBridge.xulChangeElement(self.area, id, xml)
  191.         else:
  192.             for name, value in changeHint.changedAttributes.items():
  193.                 if value is not None:
  194.                     frontend.jsBridge.xulChangeAttribute(self.area, id, name, value)
  195.                     continue
  196.                 frontend.jsBridge.xulRemoveAttribute(self.area, id, name)
  197.             
  198.  
  199.     
  200.     def hideItem(self, id):
  201.         frontend.jsBridge.xulHideElement(self.area, id)
  202.  
  203.     hideItem = deferUntilLoad(hideItem)
  204.     
  205.     def showItem(self, id):
  206.         frontend.jsBridge.xulShowElement(self.area, id)
  207.  
  208.     showItem = deferUntilLoad(showItem)
  209.     
  210.     def onDeselected(self, frame):
  211.         pass
  212.  
  213.     
  214.     def getEventCookie(self):
  215.         return ''
  216.  
  217.     
  218.     def getDTVPlatformName(self):
  219.         return 'xul'
  220.  
  221.     
  222.     def getBodyTagExtra(self):
  223.         return ''
  224.  
  225.     
  226.     def onURLLoad(self, url):
  227.         '''Called when this HTML browser attempts to load a URL (either
  228.         through user action or Javascript.) The URL is provided as a
  229.         string. Return true to allow the URL to load, or false to cancel
  230.         the load (for example, because it was a magic URL that marks
  231.         an item to be downloaded.) Implementation in HTMLDisplay always
  232.         returns true; override in a subclass to implement special
  233.         behavior.'''
  234.         return True
  235.  
  236.     
  237.     def unlink(self):
  238.         
  239.         try:
  240.             urlcallbacks.removeCallback(self.location)
  241.         except KeyError:
  242.             pass
  243.  
  244.  
  245.     
  246.     def __del__(self):
  247.         self.unlink()
  248.  
  249.  
  250.